package org.monster.context.core;

import org.monster.context.reader.tag.FilterTag;

import javax.servlet.Filter;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 过滤器配置缓存
 *
 * @author Monster
 */
public class FilterConfigCache {

    /**
     * 过滤器标签 键值
     */
    private static final Map<String, List<FilterTag>> tags = new HashMap<>();
    /**
     * 过滤器 键值
     */
    private static final Map<String, Filter> filters = new HashMap<>();
    /**
     * 过滤器配置缓存
     */
    private static FilterConfigCache filterConfigCache = null;
    /**
     * 转发uri
     */
    private String forwardURI = null;

    /**
     * 初始化 过滤器配置缓存
     */
    public static synchronized void initFilterConfigCache() {
        if (filterConfigCache == null) {
            filterConfigCache = new FilterConfigCache();
        }
    }

    /**
     * 获取 过滤器配置缓存
     *
     * @return 过滤器配置缓存
     */
    public static synchronized FilterConfigCache getFilterConfigCache() {
        if (filterConfigCache == null) {
            initFilterConfigCache();
        }
        return filterConfigCache;
    }

    /**
     * 获取 转发uri
     *
     * @return 转发uri
     */
    public String getForwardURI() {
        return forwardURI;
    }

    /**
     * 设置 转发uri
     *
     * @param forwardURI 转发uri
     */
    public void setForwardURI(String forwardURI) {
        this.forwardURI = forwardURI;
    }

    /**
     * 添加 标签
     *
     * @param key  键
     * @param tags 标签 键值
     */
    public void addTags(String key, List<FilterTag> tags) {
        FilterConfigCache.tags.put(key, tags);
    }

    /**
     * 获取 标签 键值
     *
     * @return 标签 键值
     */
    public Map<String, List<FilterTag>> getTags() {
        return Collections.unmodifiableMap(tags);
    }

    /**
     * 获取 标签 集合
     *
     * @param key 键
     * @return 标签 集合
     */
    public List<FilterTag> getTag(String key) {
        return tags.get(key);
    }

    /**
     * 清除
     */
    public void clearTags() {
        tags.clear();
    }

    /**
     * 添加 过滤器
     *
     * @param key    键
     * @param filter 过滤器
     */
    public void addFilter(String key, Filter filter) {
        filters.put(key, filter);
    }

    /**
     * 获取 过滤器
     *
     * @param key 键
     * @return 键值
     */
    public Filter getFilter(String key) {
        return filters.get(key);
    }

    /**
     * 清除 过滤器
     */
    public void clearFilters() {
        filters.clear();
    }

}
